Variables categóricas

R para Ciencia de Datos en Salud:
Análisis Descriptivo e Inferencia Estadística

Percy Soto-Becerra M.D., M.Sc(c)

InkaStats Data Science Solutions | Medical Branch
@github/psotob91

Medidas de frecuencia

Análisis descriptivo de variables categóricas

¿Qué describir de los datos categóricos?

  • Frecuencia absoluta

  • Frecuencia relativa

    • Proporción

      • Entre 0 y 1
    • Porcentaje

      • Entre 0% y 100% = Proporción * 100 %

El tamaño importa

  • Si n es pequeño (< 100, habitualmente)

    • Mejor solo reportar frecuencias absolutas.

    • Porcentajes pueden ser contraintuitivos.

  • Si n es mayor que 100

    • Frecuencias absolutas + relativas (en %, a menudo).

Algunos proporciones tienen nombres propios

  • Frecuencias relativas de eventos de interés (problemas de salud, estados de salud, enfermedades, etc.) suelen tener nombres específicas en Epidemiología Clínica y Bioestadística.

  • El nombre depende de cómo se construye la proporción.

    • Prevalencia
    • Incidencia Acumulada o Proporción de Incidencia
    • Odds
      • Prevalente
      • Incidente
  • Algunos diseños de estudio permiten su cálculo, otros, los vuelven imposibles.

Frecuencias Relativas en Bioestadística y Epi Clínica

Proporción de una población específica que está afectada por un evento de salud de interés (típicamente una enfermedad o factor de riesgo, pero también puede ser factor benéfico) en un tiempo específico.

\[Prevalencia = \frac{\text{Nº de eventos en t}}{\text{Nº de eventos + Nº sin evento en t}}\]

  • El tiempo específico puede ser un punto, un periodo o toda una vida.

  • Puede calcularse en una muestra cualquiera, pero a menudo interesan prevalencias de poblaciones relevantes.

    • Hablaremos de esto mejor en la sección de estimación.
  • Tipos de prevalencia: Dependen de qué es \(t\)
    • Prevalencia puntual: \(t\) es solo un momento.
    • Prevalencia de intervalo: \(t\) es un intervalo definido de tiempo.
    • Prevalencia de vida: \(t\) es todo el intervalo de la vida del sujeto (desde que ocurrió alguna vez el evento).

Proporción de incidencia o incidencia acumulada es la probabilidad de que ocurra un nuevo evento particular (tal como una enfermedad) antes de un tiempo dado.

  • El cáculo es directo si no han habido pérdidas en el seguimiento de los individuos y la fórmula es la siguiente:

\[ \text{Incidencia Acumulada} = \frac{\text{Nº eventos nuevos durante periodo t}}{\text{Nº de individuos sin evento en risgo al inicio del periodo t}} \]

  • El cálculo no es directo si hay pérdidas de seguimiento (lo conversaremos en otra clase).

Prevalencia versus Incidencia Acumulada

Prevalencia Incidencia Acumulada
Numerador Eventos existentes en t Eventos nuevos durante el periodo t
Denominador Todos los individuos (con y sin eventos) en t Individuos sin evento al inicio del periodo t
¿Probabilidad de qué...? Probabilidad de tener el evento Probabilidad de desarrolalr evento nuevo
Notas Solo requiere un punto en el tiempo. A menudo se busca poblaciones relevantes y usa muestras probabilísticas. Requiere al menos dos puntos de tiempo. Puede estimarse en poblaciones relevantes. A menudo se usan muestras no probabilísticas en las que es factible el seguimiento (p. ej., pacientes)

Es la razón de la probabilidad del evento entre la probabilidad del no evento.

\[Odds = \frac{Pr(evento)}{Pr(\text{no evento})} = \frac{Pr(evento)}{1 - Pr(\text{evento})}\]

  • Es solo una forma diferente de escribir la probabilidad del evento.

    • Análogo a expresar en céntimos y no en soles el precio de algo.
    • Por tanto, es una forma diferente de expresar lo mismo:
      • La frecuencia relativa de un evento y, a través de esta, su incertidumbre asociada.
  • Si probabilidad de ganar es de 0.8 (~80%), entonces el odds es 4. El odds se interpretaría como:

                    La probabilidad de ganar es 4
                  veces la probabilidad de perder.

  • Odds y probabilidad son diferentes, pero tienen valores muy similares cuando la probabilidad del evento es muy pequeña.
Probabilidad Odds Diferencia
0.000 0.0000000 0.0000000
0.010 0.0101010 0.0001010
0.020 0.0204082 0.0004082
0.030 0.0309278 0.0009278
0.040 0.0416667 0.0016667
0.050 0.0526316 0.0026316
0.100 0.1111111 0.0111111
0.200 0.2500000 0.0500000
0.300 0.4285714 0.1285714
0.400 0.6666667 0.2666667
0.500 1.0000000 0.5000000
0.800 4.0000000 3.2000000
0.900 9.0000000 8.1000000
0.990 99.0000000 98.0100000
0.999 999.0000000 998.0010000



  • Los odds no se usan mucho en epidemiología para expresar frecuencias; pero una medida derivada de esta sí se usa mucho para expresar asociación: la razón de odds (OR).

  • En epidemiología, las proporciones o probabilidades puede ser incidencias acumuladas o prevalencias, por lo que tenemos dos tipos de Odds:

Odds prevalente

\[Odds_{Prevalente} = \frac{Prevalencia}{1 - Prevalencia}\]

Odds incidente

\[Odds_{Incidente} = \frac{\text{Incidencia Acumulada}}{1 - \text{Incidencia Acumulada}}\]

Medidas de resumen de variables categóricas con R

Análisis con R

  • Hay varias opciones en R.

  • Las más personalizables se basan en {dplyr} y {janitor} (funciones summarise()), pero requieren más código.

    • Usar estas si se necesitan elaborar tablas ad hoc para reportes repropducibles muy sui generis.

    • También son necesarias para gráficos en {ggplot2}

  • Las opciones que requieren poco código y son directas tienen el problema de que no son personalizables:

    • {summarytools}

    • {DescTools}

    • {Hmisc}

    • Usar estas si solo se requiere inspeccionar los datos pero no se hará ningún reporte reproducibl sui generis.

La función table() y prop.table()es la más usada. Sin embargo, genera tablas “sucias” que requieren mucho código para personalizarse.

  • Tabla de frecuencias absolutas
table(bd_inmuno$sexo)

 Femenino Masculino 
      189        95 
  • Tabla de frecuencias relativas
prop.table(table(bd_inmuno$sexo))

 Femenino Masculino 
 0.665493  0.334507 
  • Tabla de frecuencias incluyendo los datos faltantes
table(bd_inmuno$sexo, useNA = "always")

 Femenino Masculino      <NA> 
      189        95         1 

Podemos combinar la funcion group_by() con summarise() para generar una tabla de frecuencias de la variable de interés. Podemos también tomar un atajo con count

  • Frecuencias absolutas: Forma larga
bd_inmuno %>% 
  group_by(sexo) %>% 
  summarise(n = n())
# A tibble: 3 × 2
  sexo          n
  <fct>     <int>
1 Femenino    189
2 Masculino    95
3 <NA>          1
  • Frecuencias absolutas + relativas: Forma larga
library(scales) # Para agregar escalas, p. ej., porcentajes %
bd_inmuno %>% 
  group_by(sexo) %>% 
  summarise(n = n()) %>% 
  mutate(
    Porcentaje = scales::percent(n / sum(n))
  )
# A tibble: 3 × 3
  sexo          n Porcentaje
  <fct>     <int> <chr>     
1 Femenino    189 66%       
2 Masculino    95 33%       
3 <NA>          1 0%        
  • Frecuencias absolutas: Atajo con count()
bd_inmuno %>% 
  count(sexo)
# A tibble: 3 × 2
  sexo          n
  <fct>     <int>
1 Femenino    189
2 Masculino    95
3 <NA>          1
  • Frecuencias absolutas + relativas: Atajo con count()
library(scales) # Para agregar escalas, p. ej., porcentajes %
bd_inmuno %>% 
  count(sexo) %>% 
  mutate(
    Porcentaje = scales::percent(n / sum(n))
  )
# A tibble: 3 × 3
  sexo          n Porcentaje
  <fct>     <int> <chr>     
1 Femenino    189 66%       
2 Masculino    95 33%       
3 <NA>          1 0%        

El paquete {janitor}, a través de su función [tabyl(){.plo}], ofrece atajos y funciones pre-definidas para realizar tablas basadas en funciones de {dplyr}.

  • {janitor} ejecuta internamente summarise(), group_by() y otras funciones más, simplificando notoriamente el código.
  • Hay que instalar el paquete {janitor} y luego cargarlo
library(janitor)

Tabla simple generada por tabyl()

bd_inmuno %>% 
  tabyl(sexo)
      sexo   n     percent valid_percent
  Femenino 189 0.663157895      0.665493
 Masculino  95 0.333333333      0.334507
      <NA>   1 0.003508772            NA

Puedes “adornar” la tabla usando más funciones de {janitor}

Cambiar formato de porcentaje a %

bd_inmuno %>% 
  tabyl(sexo, show_na = FALSE) %>% 
  adorn_pct_formatting()
      sexo   n percent
  Femenino 189   66.5%
 Masculino  95   33.5%
  • Puedes suprimir los datos perdidos
bd_inmuno %>% 
  tabyl(sexo, show_na = FALSE)
      sexo   n  percent
  Femenino 189 0.665493
 Masculino  95 0.334507

Agregar totales

bd_inmuno %>% 
  tabyl(sexo, show_na = FALSE) %>% 
  adorn_pct_formatting() %>% 
  adorn_totals()
      sexo   n percent
  Femenino 189   66.5%
 Masculino  95   33.5%
     Total 284       -

Configurar precisión decimal

bd_inmuno %>% 
  tabyl(sexo, show_na = FALSE) %>% 
  adorn_pct_formatting(digits = 2) %>% 
  adorn_totals() 
      sexo   n percent
  Femenino 189  66.55%
 Masculino  95  33.45%
     Total 284       -

Si queremos una evaluación rápida de varias variables puede ser obtenida usando la función freq() del paquete {summarytools}

  • Una sola variable:
bd_inmuno %>% 
  select(sexo) %>% 
  freq()
Frequencies  
bd_inmuno$sexo  
Label: genero  
Type: Factor  

                  Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
--------------- ------ --------- -------------- --------- --------------
       Femenino    189     66.55          66.55     66.32          66.32
      Masculino     95     33.45         100.00     33.33          99.65
           <NA>      1                               0.35         100.00
          Total    285    100.00         100.00    100.00         100.00
  • Solo las seleccioandas
bd_inmuno %>% 
  select(sexo, comorb) %>% 
  freq()
Frequencies  
bd_inmuno$sexo  
Label: genero  
Type: Factor  

                  Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
--------------- ------ --------- -------------- --------- --------------
       Femenino    189     66.55          66.55     66.32          66.32
      Masculino     95     33.45         100.00     33.33          99.65
           <NA>      1                               0.35         100.00
          Total    285    100.00         100.00    100.00         100.00

bd_inmuno$comorb  
Label: comorbilidad  
Type: Factor  

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
         No    214     75.09          75.09     75.09          75.09
         Sí     71     24.91         100.00     24.91         100.00
       <NA>      0                               0.00         100.00
      Total    285    100.00         100.00    100.00         100.00
  • Todas las variables categóricas
bd_inmuno %>% 
   freq()
Frequencies  
bd_inmuno$sexo  
Label: genero  
Type: Factor  

                  Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
--------------- ------ --------- -------------- --------- --------------
       Femenino    189     66.55          66.55     66.32          66.32
      Masculino     95     33.45         100.00     33.33          99.65
           <NA>      1                               0.35         100.00
          Total    285    100.00         100.00    100.00         100.00

bd_inmuno$comorb  
Label: comorbilidad  
Type: Factor  

              Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
----------- ------ --------- -------------- --------- --------------
         No    214     75.09          75.09     75.09          75.09
         Sí     71     24.91         100.00     24.91         100.00
       <NA>      0                               0.00         100.00
      Total    285    100.00         100.00    100.00         100.00

bd_inmuno$tipo_refuerzo  
Label: tipo_refuerzo  
Type: Character  

                       Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
-------------------- ------ --------- -------------- --------- --------------
      (Empty string)      1      0.35           0.35      0.35           0.35
          Heterologo    228     80.00          80.35     80.00          80.35
            Homologo     56     19.65         100.00     19.65         100.00
                <NA>      0                               0.00         100.00
               Total    285    100.00         100.00    100.00         100.00

bd_inmuno$ant_COV  
Label: ant_COV  
Type: Factor  

                        Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
--------------------- ------ --------- -------------- --------- --------------
         No Infection    201     70.53          70.53     70.53          70.53
      Prior Infection     84     29.47         100.00     29.47         100.00
                 <NA>      0                               0.00         100.00
                Total    285    100.00         100.00    100.00         100.00
  • Eliminando los datos perdidos y otras caracteristicas:
bd_inmuno %>% 
   freq(report.nas = FALSE, 
        totals = FALSE,
        cumul = FALSE, 
        headings= FALSE)
bd_inmuno$sexo  

                  Freq       %
--------------- ------ -------
       Femenino    189   66.55
      Masculino     95   33.45

bd_inmuno$comorb  

           Freq       %
-------- ------ -------
      No    214   75.09
      Sí     71   24.91

bd_inmuno$tipo_refuerzo  

                       Freq       %
-------------------- ------ -------
      (Empty string)      1    0.35
          Heterologo    228   80.00
            Homologo     56   19.65

bd_inmuno$ant_COV  

                        Freq       %
--------------------- ------ -------
         No Infection    201   70.53
      Prior Infection     84   29.47

Hmisc ofrece otra forma rápida de describir todas las variables categóricas de interés. Solo hay que seleccionar las variables categóricas de interés y describirlas con la función describe()

  • Una sola variable:
bd_inmuno %>% 
  select(sexo) %>% 
  describe()
. 

 1  Variables      285  Observations
--------------------------------------------------------------------------------
sexo : genero 
       n  missing distinct 
     284        1        2 
                              
Value       Femenino Masculino
Frequency        189        95
Proportion     0.665     0.335
--------------------------------------------------------------------------------
  • Se seleccionan las variables y luego se describen
bd_inmuno %>% 
  select(sexo, comorb, tipo_refuerzo, ant_COV) %>% 
  describe() 
. 

 4  Variables      285  Observations
--------------------------------------------------------------------------------
sexo : genero 
       n  missing distinct 
     284        1        2 
                              
Value       Femenino Masculino
Frequency        189        95
Proportion     0.665     0.335
--------------------------------------------------------------------------------
comorb : comorbilidad 
       n  missing distinct 
     285        0        2 
                      
Value         No    Sí
Frequency    214    71
Proportion 0.751 0.249
--------------------------------------------------------------------------------
tipo_refuerzo  Format:%10s 
       n  missing distinct 
     284        1        2 
                                
Value      Heterologo   Homologo
Frequency         228         56
Proportion      0.803      0.197
--------------------------------------------------------------------------------
ant_COV 
       n  missing distinct 
     285        0        2 
                                          
Value         No Infection Prior Infection
Frequency              201              84
Proportion           0.705           0.295
--------------------------------------------------------------------------------

Análisis descriptivo de variable categórica - recomendaciones

  • Se estila reportar los resultados como números en tablas.

  • En el texto, se puede resaltar los resultados de una o más variables de interés.

  • Un ejemplo de esto sería:

bd_inmuno %>% 
  select(sexo, ant_COV) %>% 
   freq(report.nas = FALSE, 
        totals = FALSE,
        cumul = FALSE, 
        headings= FALSE)
bd_inmuno$sexo  

                  Freq       %
--------------- ------ -------
       Femenino    189   66.55
      Masculino     95   33.45

bd_inmuno$ant_COV  

                        Freq       %
--------------------- ------ -------
         No Infection    201   70.53
      Prior Infection     84   29.47
  • Interpretación tentativa para sexo:

        “El 66.6% de los participantes fueron mujeres. (…)”

  • Algunos sugieren agregar la información de las frecuencias absolutas:

        “El 66.6% (189 / 284) de los participantes fueron
        mujeres. (…)“

  • Para el caso de eventos de salud, se estila usar los términos prevalencia o incidencia acumulada si el diseño lo permite. Por tanto, una interpretación tentativa para antecedente de infección por COVID-19:

       “La prevalencia de antecedente de infección previa por
       COVID-19 fue de 29.47% (84 / 285). (…)“

Nuestro turno


  • Descargue la carpeta var_cat_resumen.

  • Abra el proyecto var_cat_resumen.Rproj y dentro de este, abra el archivo quarto var_cat_resumen.qmd.

  • Siga las instrucciones indicadas en este.

  • Renderice el archivo quarto final.




10:00